<?php
declare(strict_types=1);
/**
 * Author: Traveler
 * Time  : 2021/8/31 14:30
 */

namespace sunshine\utils;


use think\Response;

/**
 * 接口Json统一返回类
 *
 * @package sunshine\utils
 */
class Json
{
    /**
     * 附加数据
     *
     * @var array
     */
    private $additions = [];

    /**
     * 附加响应头
     *
     * @var array
     */
    private $headers = [];

    /**
     * http状态码
     *
     * @var integer
     */
    private $statusCode = 200;

    /**
     * 输出选项
     *
     * @var array
     */
    private $options = [];

    /**
     * 统一的API接口返回
     *
     * @param array      $apiError 返回的错误码
     * @param array|null $data     返回的数据
     * @return Response
     */
    public function api(array $apiError, array $data = null): Response
    {
        return $this->make($apiError[0], $apiError[1], $data);
    }

    /**
     * 简单的自定义json返回
     *
     * @param mixed $result
     * @return Response
     */
    public function json($result = ''): Response
    {
        // 空数据
        if (!is_numeric($result) && empty($result)) {
            $result = (object) null;
        }

        return Response::create($result, 'json', $this->statusCode)->header($this->headers)->options($this->options);
    }

    /**
     * 操作成功的快捷方法
     *
     * @param string $message 提示信息
     * @param array  $data    返回的数据
     * @return Response
     */
    public function success(string $message = '操作成功', array $data = []): Response
    {
        return $this->make(0, $message, $data);
    }

    /**
     * 操作失败的快捷方法
     *
     * @param string $message 提示信息
     * @param array  $data    返回的数据
     * @return Response
     */
    public function failure(string $message = '操作失败', array $data = []): Response
    {
        return $this->make(1, $message, $data);
    }

    /**
     * 生成Json响应信息
     *
     * @param int        $code    错误代码
     * @param string     $message 提示信息
     * @param array|null $data    返回的数据
     * @return Response
     */
    private function make(int $code, string $message, ?array $data): Response
    {
        $result = compact('code', 'message', 'data');

        if (!empty($this->additions)) {
            $result = array_merge($result, $this->additions);
        }

        return Response::create($result, 'json', $this->statusCode)->header($this->headers)->options($this->options);
    }

    /**
     * 设置附加数据
     * 如：表格组件的total\page等数据
     *
     * @param array $data 要附加的数据
     * @return $this
     */
    public function attach(array $data): Json
    {
        $this->additions = array_merge($this->additions, $data);

        return $this;
    }

    /**
     * 设置附加响应头
     *
     * @param array $headers 要附加的响应头
     * @return $this
     */
    public function header(array $headers): Json
    {
        $this->headers = array_merge($this->headers, $headers);

        return $this;
    }

    /**
     * 设置http状态码
     *
     * @param int $code http状态码
     * @return $this
     */
    public function code(int $code): Json
    {
        $this->statusCode = $code;

        return $this;
    }
}